/**
   Date     : 2022-11-22
   com5      esp
*/

#include "main.h" //程序执行会先导入main.h

// 全局变量
float Temperature = 0.0;
float Humidity = 0.0;
float Turbidity = 0.0;
float PH = 0.0;
float Hardness = 0.0;
float Sulfate = 0.0;
/**
   软串口通信
*/
String receive_data = "";             // 用于接收mega的数据
SoftwareSerial megaEspSerial(RX, TX); // D3 D4

/**
 * 将阿里云下发的属性通过串口发送至mega
 */
void sendAlyDataToMega()
{
    StaticJsonDocument<1048> jsonData;                  // 构建json
    jsonData[PH_MAX_ID] = serialized(String(phMax, 2)); // 给单精度浮点型测试属性此键赋值，保留2位小数
    jsonData[PH_MIN_ID] = serialized(String(phMin, 2)); // 给单精度浮点型测试属性此键赋值，保留2位小数
    jsonData[TU_MAX_ID] = serialized(String(tuMax, 2)); // 给单精度浮点型测试属性此键赋值，保留2位小数
    String data = "";
    serializeJson(jsonData, data); // 将JSON对象转换成字符串，序列化Json
    debugSerial.println(data);
    megaEspSerial.println(data);
}

/**
   函数功能：程序初始化时调用，仅执行一次
*/
void setup()
{
    delay(2000); // 等待设备上电稳定

    debugSerial.begin(debugSerialBuadrate); // 初始化调试打印的串口波特率
    debugSerial.println("\r\n程序开始初始化......");

    initWifi();    // 初始化wifi
    initAlyMqtt(); // 初始阿里云Mqtt
    initU8g2();    // 初始化U8g2
    debugSerial.println("\r\n程序初始化完成！");

    blinkerSetUp(); // 初始化blinker
    // 监听mega传输进来的数据
    megaEspSerial.begin(9600); // 初始化软串口通信 用于接收mega数据
    megaEspSerial.listen();    // 监听软串口通信
}

/**
   函数功能：程序主循环函数，重复运行
*/

void loop()
{
    if (megaEspSerial.available() > 0)
    {
        if (megaEspSerial.peek() != '\n') // peek并不会将数据从缓冲区清除
        {
            receive_data += char(megaEspSerial.read());
        }
        else
        {
            megaEspSerial.read(); // 将\n从缓冲区清除
            debugSerial.println("接收来自mega的数据: [" + receive_data + "] !!!");
            displayAttr(receive_data);             // 在oled显示数据
            checkMqttAndReconnect();               // 检查MQTT和重连
            reportMultipleAttribute(receive_data); // 属性上报至阿里云(MQTT)
            reportQT(receive_data);                // 属性上报至QT(TCP)
            Blinker.run();                         // 运行blinker
            receive_data = "";                     // 清空全局变量
            // 将阿里云下发的属性发送至mega
            sendAlyDataToMega();
        }
    }
}
